今天會介紹一些 flask 的基本函式,所以我們還沒有正式開始寫專案。這些基本的函式十分常用,甚至有些會在幾乎每個有關 flask 的檔案中反覆出現,所以我選擇放在最前面介紹,未來如果有忘記的可以回來看一下。
我們先從一個簡單的範例來看起。請注意如果要實作的話檔名務必使用 app.py,後面會解釋。
from flask import Flask
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index():
    return "Index Page"
app.run(host="127.0.0.1", port=8080, debug=True)
接著只要在 command line 下指令:python app.py,flask 就會把這個網站建立起來,可以打開瀏覽器輸入 127.0.0.1:8080,沒有意外的話可以看到有一行 Index Page 寫在上面。
接下來我會逐行解釋這個簡單的網站:
app 作為這個 flask application 的實體。/,這邊要注意的是 flask 要求每個路徑都要用 / 開頭,如 /meow、/user 等等,meow 是不被允許的,會跳出 ValueError: urls must start with a leading slash。methods 是一個 list,裡面是這個路徑所允許的 HTTP method,這邊我用 GET 和 POST 為例。如果對裝飾器不熟悉可以閱讀此篇,在此處我不多加解釋其功用。/ 的 request,這個函式名稱隨意,但未來會用到。Index Page,也就是剛剛在瀏覽器看到的東西。它的目的就是回傳 HTML 或是 response (後面會提到),未來還會加入更多複雜的方式來 render 網頁。app.run() 讓他跑,並用 host、port 來指定要跑在哪裡,如果是在有公開 IP 的伺服器上可以直接把 host 設為該 IP,最後的 debug=True 表示現在是開發模式,flask 會打開一些 debug 的工具,等等會解釋。但未來基本上不會使用此方法,所以不會介紹太多。要把這個網站跑起來還有第二個方法,可以在命令列輸入 flask run,這個指令是跟著 pip install flask 一起安裝的。
但要注意的是,使用這個指令會自動把程式碼裡面的 app.run() 忽略,也就是說,他會自動忽略上面的 host 和 port,在未指定的情況下,預設 host=127.0.0.1、port=5000。如果要指定的話,需要傳入參數,如 flask run --host 127.0.0.1 --port 8080,這樣會達到和上面相同的效果。
此外,理論上我們需要設定 FLASK_APP 這個環境變數,它的作用是告訴 flask 你的 flask application 在哪裡。當沒有設定的時候,他會自動去尋找 app.py、wsgi.py 或是裡面有 create_app、make_app 函式的模組 (後面會提到)。也就是說,如果這時候檔名不是 app.py,他剛剛就不會順利執行了。
最後還有一個要注意的點,在執行的時候 (兩種方法都是) 畫面應該會跑出一行紅字:WARNING: This is a development server. Do not use it in a production deployment.,這表示這個執行方法並不適合用於 production。但我們現在只是用於開發,所以可以設定 FLASK_ENV=DEVELOPMENT 這個環境變數,來告訴 flask 現在使用的環境為開發環境。在更改為開發環境的同時,flask 會打開一些 debug 相關的功能:
500 Internal Server Error。127.0.0.1:8080/console,flask 有一個內建的 interactive debugger 可以讓你跟系統互動。稍微修改一下剛剛的程式碼,加入一些新東西。
from flask import Flask
app = Flask(__name__)
@app.route("/", methods=["GET", "POST"])
def index():
    return "Index Page"
    
@app.route("/dynamic/<int:id>", methods=["GET"])
def dynamic_url_page(id):
    return str(id)
app.run(host="127.0.0.1", port=8080, debug=True)
在這個範例裡,我們新增了第二個路徑 /dynamic/<int:id>,前面的 /dynamic 跟上面的 / 是接近的,新的東西在後面的 /<int:id>。
他是 flask 提供的「動態路徑」功能,冒號前面的 int 表示他的型別,後面的 id 則是變數名稱,而這個變數需要在下方處理 request 的函式中作為一個參數。這時候存取 /dynamic/1,flask 就會傳回 1,但如果存取 /dynamic/meow,那就會傳回 404 Not Found,因為 meow 並非一個整數,並沒有符合這條路徑規則。
我們也可以把規則寫成 /dynamic/@<int:id>,這樣一來,存取 /dynamic/@1 就會傳回 1。
值得一提的是,如果在回傳的時候沒有先把 id 轉型成 str,那 flask 會有錯誤:TypeError: The view function did not return a valid response. The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a int.,這表示你回傳的不是正確的型別,合法的型別只有 str、Response (未來會提到) 等等,其餘可以參考附錄一。
今天看了兩個簡單的 flask 範例,基本上這樣就足以建出一個簡單的小網站,但未來我們還會繼續探討其他函式。
Flask: return value of view function
Command Line Interface